package poo.string;
import java.util.*;

public class ValutatoreInterattivoFT{
	/*
	 * Valutatore interattivo di espressioni aritmetiche intere.
	 * Gli operatori ammessi sono + - * / e sono assunti equiprioritari.
	 * Per recuperare la priorita' degli operatori moltiplicativi (* e /)
	 * rispetto a quelli additivi (+ e -) si possono introdurre sotto espressioni
	 * tra parentesi tonde. Una parentesi e' sempre valutata prima.
	 * Espressioni malformate vengono identificate e segnalate.
	 */
	static int pA=0; //contatore parentesi aperte non ancora accoppiate
	static int valutaOperando( StringTokenizer st ){
		String tk=st.nextToken();
		if( tk.equals(')') ) //il primo operando non puo' iniziare con )
			throw new RuntimeException();
		if( tk.equals("(") ){
			pA++;
			return valutaEspressione( st );
		}
		else
			return Integer.parseInt( tk );
	}//valutaOperando
	static int valutaEspressione( StringTokenizer st ){
		try{
			int esito=valutaOperando( st );
			while( st.hasMoreTokens() ){
				char op=st.nextToken().charAt(0);
				if( op==')' ){
					if( pA==0 ) throw new RuntimeException();
					pA--;
					return esito;
				}
				int opnd=valutaOperando( st );
				switch( op ){
					case '+': esito += opnd; break;
					case '-': esito -= opnd; break;
					case '*': esito *= opnd; break;
					default : esito /= opnd; 
				}
			}
			if( pA>0 ) throw new RuntimeException();
			return esito;
		}catch( RuntimeException ex ){
			pA=0;
			throw ex;
		}
	}//valuta
	public static void main( String... args ){
		System.out.println("Valutatore interattivo di espressioni."+
					       " Inserire . per terminare");
		System.out.println("Operandi interi senza segno. Operatori +-*/()");
		String linea=null;
		Scanner sc=new Scanner( System.in );
		for(;;){
			System.out.print("> ");
			linea=sc.nextLine();
			if( linea.equals(".") ) break;
			StringTokenizer st=new StringTokenizer( linea, "+-*/()", true );
			int ris;
			try{
				ris=valutaEspressione( st );
				System.out.println(linea+"="+ris);
			}catch( Exception e ){
				System.out.println("Espressione malformata!");
			}

		}
		System.out.println("Bye.");
	}
}//ValutatoreInterattivoFT
